תור,מחסנית פולינה לוצקר וערימה מבני נתונים ואלגוריתמים
מנהלות מרצה הקורס: פרופסור יורם לוזון פולינה מתרגלת: לוצקר אימייל: polinalutbiu@gmail.com, שעות קבלה: 13:00-15:00 יום שני בתיאום מראש. אתר הקורס: math-wiki,1 דרישות קדם: לינארית 1,אינפי ידע בתכנות.
תרגילי בית מדי שבוע יתפרסם תרגיל בית חדש. שבוע אחד תרגיל תכנותי ושבוע אחד תרגיל תאורטי. תרגילי תכנות הם להגשה חובה! ההגשה דרך submit https://submit.cs.biu.ac.il/cgi-bin/welcome.cgi יש לכתוב בשפת Python 3 פידבק ישלח לכם למייל אחרי ההגשה- הפידבק אינו הציון שלכם! אין בדיקה ידנית תהיה בדיקת העתקה התרגילים התאורטיים אינם להגשה אלא לאימון עצמי בלבד.
קוד פסאודו ויקפדיה: תיאור מצומצם ולא רשמי לאלגוריתם של תוכנית מחשב. פסאודו קוד משתמש בקונבנציות של שפות תכנות, אך מיועד לקריאה של בני אדם ולא לקריאה על ידי מחשב. הביטויים שנכתבים בפסאודו קוד אינם ניתנים להידור )עיבוד הטקסט על ידי מחשב( בפני עצמם, אך הם ניתנים לתכנות כקוד אמיתי שכן ניתן להידור בכל שפת תכנות שהיא.
מחסנית LIFO=LAST IN FIRST OUT תומך בפעולות: init Push isempty top Pop )Destack) ניתן ליישום באמצעות מערך או באמצעות רשימה מקושרת. היעילות- )פרט לריקון מחסנית המיושמת בעזרת רשימה-
תור FIFO=FIRST IN FIRST OUT תומך בפעולות: init insert isempty head top )DeQueue) ניתן ליישום באמצעות מערך או באמצעות רשימה מקושרת. היעילות- )פרט לריקון מחסנית המיושמת בעזרת רשימה-
תרגיל 1 יש שתי מחסניות, אחת מלאה ואחת ריקה. כתבו אלגוריתם המעביר את תוכן המחסנית הראשונה למחסנית השנייה ומרוקן את השנייה.
תרגיל 1 יש שתי מחסניות, אחת מלאה ואחת ריקה. כתבו אלגוריתם המעביר את תוכן המחסנית הראשונה למחסנית השנייה ומרוקן את השנייה. while S1.empty() == False: T.push(S1.pop()) while T.empty() == False: S2.Push(T.pop()) פתרון: קלט: S1 מלאה, S2 ריקה. -ניצור מחסנית ריקה T. מה היעילות?
- בדיקת תקינות סוגריים תרגיל 2 תיאור הבעיה: ביטוי חשבוני תקין מבחינת סוגריים: יכול להכיל מספר לא מוגבל של סוגריים מסוגים שונים, ובלבד שיהיו מאוזנים. איזון הסוגריים מחייב שמספר הפותחים והסוגרים יהיה שווה בדיוק. לכל פותח יימצא סוגר מאותו סוג במקום המתאים. דוגמה לביטוי תקין: ))5(( )7-]5-6[( דוגמה לביטוי לא תקין: 5( )5-7 {
בדיקת תקינות סוגריים-המשך - תרגיל 2 נניח ויש לנו סוגריים מהסוג ])} {([. true כתבו אלגוריתם המקבל כקלט ביטוי חשבוני S, מבחינת סוגריים ו false אם לא. ומחזיר אם הביטוי תקין
בדיקת תקינות סוגריים-פתרון - תרגיל 2 Create an empty stack T. For ch in S: if ch is one of (,[,{: T.push(ch) else if ch in one of )]}: if T.empty == True: return False if T.pop() doesn t match ch: return False If T.empty == False: return False Return True
בדיקת תקינות סוגריים-פתרון - תרגיל 2 Create an empty stack T. For ch in S: if ch is one of (,[,{: T.push(ch) else if ch in one of )]}: if T.empty == True: return False if T.pop() doesn t match ch: return False If T.empty == False: return False Return True בודק האם יש יותר סוגריים סוגרים מאשר פתוחים בודק האם יש יותר סוגריים פותחים מאשר סוגרים
תרגיל 3 ממשו תור בעזרת מחסניות..s2 s1 רמז: יש להשתמש בשתי מחסניות ו
תרגיל 3 -פתרון.s1.push(x) פתרון: הכנסה: הכנסה של איבר הוצאה: x תתבצע על ידי if s2.empty == False: return s2.pop() Else If s1.empty == False: while s1.empty == False: s2.push(s1.pop)) return s2.pop() Else: Return empty
מציאת אורך המסלול הקצר ביותר במבוך בינארי תיאור הבעיה: בהינתן מטריצה MxN בינארית )כל איבר הינו 0 או 1( נרצה למצוא את המסלול הקצר ביותר בין נקודת התחלה לנקודת סיום. המסלול יכול להיווצר רק דרך תאים שערכם הינו 1. ניתן ללכת למעלה, למטה, ולצדדים )אין ללכת באסלון(. דרישה: היעילות O(MN)
מציאת אורך המסלול הקצר ביותר במבוך בינארי דוגמה: עבור המטריצה 1 1 1 1 0 1 1 1 1 )2,0( נרצה למצוא מסלול מהנקודה )0,0( עד לנקודה תשובה: 2
מציאת אורך המסלול הקצר ביותר במבוך בינארי דוגמה: עבור המטריצה 1 1 0 1 1 0 0 0 1 )2,2) נרצה למצוא מסלול מהנקודה )0,0( עד לנקודה תשובה: 1- אין מסלול.
פתרון בעזרת תור.1.2 ניצור תור ריק ומטריצת עזר בגודל המסלול התור יכיל את הקואורדינטות של המטריצה.)MXN( תחילה זו תהיה מטריצת אפסים. )Point(.3.4.5 לכל נקודה ניצור סימון- האם ביקרנו בנקודה הזו או לא- נכניס את איבר ההתחלה לתור ונסמן שביקרנו. כל עוד לא התור לא ריק: הוצא איבר מהתור. אם זו נקודת הסיום- החזר את אורך המסלול. אחרת: עבור כל אחד מארבעת הצעדים האפשריים נאתחל עבור כולם שלא ביקרנו. )התחשבו בקצוות( אם הצעד הינו 1 ביקרנו בו- הכנס לתור ועדכן את אורך המסלול לנקודה זו להיות "הורה" +1, ולא וסמן ביקרנו בו. 6. אם הגענו לסוף התור ולא הגענו לנקודת היעד- החזר שאין מסלול.
ערימה,פרט אולי לרמה האחרונה שמלאה מצד שמאל עד מערך שניתן לראות כעץ בינארי כמעט מלא. עץ בינארי כמעט מלא =עץ בינארי שבו כל הרמות מלאות נקודה מסוימת. מציאת ערכים: גובה העץ= log2(n) דוגמה: ערימת מקסימום : A[i] A[parent[i] ]>= A= [ 17 14 10 8 7 9 3 2 4 1 ] הערה לגבי המימוש: יותר נוח לממש מאינדקס 1.
ערימה- המשך פעולות ערימה: צור ערימה האם ריקה הוצא ראש ערימה הכנס לערימה )רוקן(
ערימות מינימום VS מקסימום For input -> 35 33 42 10 14 19 27 44 26 31
הוספת ערך לערימה
הוספת ערך לערימה-דוגמה נכניס את הערך 13
הוספת ערך לערימה-דוגמה
הוספת ערך לערימה-דוגמה
הוספת ערך לערימה-דוגמה
הורדת ערך מינימום/מקסימום בערימה
הורדת ערך מינימום/מקסימום בערימה דוגמה ערימה התחלתית =<
הורדת ערך מינימום/מקסימום בערימה דוגמה
הורדת ערך מינימום/מקסימום בערימה דוגמה
הורדת ערך מינימום/מקסימום בערימה דוגמה
הורדת ערך מינימום/מקסימום בערימה דוגמה
תרגיל 4,m נתונות k רשימות ממוינות באורך מזגו את הרשימות לרשימה אחת ממויינת.
תרגיל 4- פתרון H- heap of pairs of values and indexes L= array size m*k i1=i2 =ik=0 s=0 For r=1 to k H.push(Lr[ir],j) While H.isEmpty == False: (a,j) = H.pop() L[s] = a s++ ij ++ if ij<m: H.push(Lj[ij],j)
תרגיל 4- זמן ריצה H- heap of pairs of values and indexes L= array size m*k i1=i2 =ik=0 s=0 For r=1 to k H.push(Lr[ir],j) While H.isEmpty == False: (a,j) = H.pop() L[s] = a s++ ij ++ if ij<m: H.push(Lj[ij],j)